package com.yxt.common.ui;

import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.view.MotionEvent;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
import com.yxt.ui.R;

public class StationOverlay extends Overlay{
	private final static int picWidth = 20;// 气球图的宽度
	private final static int picHeight = 34;// 气球图的高度
	private final static int arcR = 8;// 信息窗口的圆角半径
	private final static int padding = 5;
	private final static int suffix = 4;
	private final static int radius = 10;
	
	private int startx;
	private int starty;
	private Context context;
	private StationOverlay currballon = null;// 表示当前选中的气球
	private String title;// 此气球对应的文字信息
	private boolean showWindow = false;// 是否显示文字信息窗口的标志位，true显示文字信息窗口
	private GeoPoint geoPoint;// 此气球对应的经纬度
	
	public StationOverlay(Context context,GeoPoint geoPoint, String title) {
		this.geoPoint = geoPoint;
		this.title = title;
		this.context = context;
	}

	// 绘制自定义Overlay的方法
	public void draw(Canvas canvas, MapView mapView, boolean shadow) {
		// 将此气球经纬度翻译成屏幕上的XY坐标供绘制气球
		Point p = getPoint(mapView);
		// 在坐标制定位置绘制气球图片
		Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.marker);
		startx = p.x - picWidth / 2;
		starty = p.y- picHeight/2;
		canvas.drawBitmap(bitmap, startx, starty, null);
		if (showWindow) {
			// 如果showWindow为true 则显示信息窗口
			drawWindow(canvas, p);// 绘制信息窗口
		}
		super.draw(canvas, mapView, shadow);// 调用父类绘制
	}

	// 重写点击事件处理方法
	public boolean onTouchEvent(MotionEvent event, MapView mv) {
		if (currballon != null && currballon != this) {
			// 若当前气球不为空且不是自己，什么都不做
			return false;
		}
		// 若在气球上按下则设置当前气球为自己，且当前状态为在气球上
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			int x = (int) event.getX();// 获取点击的x坐标
			int y = (int) event.getY();// 获取点击的y坐标
			// 将此气球的经纬度翻译成屏幕上的xy坐标
			Point p = getPoint(mv);
			int xb = p.x - picWidth / 2;// 计算气球做上侧点的x坐标
			int yb = p.y - picHeight;// 计算气球左上侧点的y坐标
			if (x >= xb && x < xb + picWidth && y >= yb && y < yb + picHeight) {
				// 若在自己这个气球上按下则设置自己为当前气球
				currballon = this;
				return true;
			}
		} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
			// 移动事件返回当前气球状态 若当前在气球上则返回true 屏幕其他移动事件
			return currballon != null;
		} else if (event.getAction() == MotionEvent.ACTION_UP) {
			int x = (int) event.getX();// 获取点击点的x坐标
			int y = (int) event.getY();// 获取点击点的y坐标
			// 将此气球的经纬度翻译成屏幕上的xy坐标
			Point p = getPoint(mv);
			int xb = p.x - picWidth / 2;// 计算气球做上侧点的x坐标
			int yb = p.y - picHeight;// 计算气球左上侧点的y坐标
			// 若当前气球为自己且在当前气球上抬起触控则显示当前气球内容
			if (currballon == this && x >= xb && x < xb + picWidth && y >= yb && y < yb + picHeight) {
				currballon = null;// 显示内容后清空单签气球引用
				showWindow = !showWindow;// 置反信息想、窗口显示标志
				List<Overlay> overlays = mv.getOverlays();
				overlays.remove(this);// 删除此气球再添加
				overlays.add(this);// 此气球位于最上面了
				for (Overlay ol : overlays) {// 清除其他气球的showWindow标记
					if (ol instanceof StationOverlay) {
						if (ol != this) {// 如果不是自己这个气球，关闭信息窗口
							((StationOverlay) ol).showWindow = false;
						}
					}
				}
				return true;
			} else if (currballon == this) {
				// 若当前气球为自己但抬起触控不在自己上则清空气球状态并返回true
				currballon = null;
				return true;
			}
		}
		return false;
	}

	public Point getPoint(MapView mapView) {
		// 将经纬度翻译成屏幕上的XY坐标
		Projection projection = mapView.getProjection();
		Point p = new Point();// 创建用于存储XY坐标的point对象
		projection.toPixels(geoPoint, p);// 调用toPoint方法进行换算
		return p;// 返回结果
	}

	// 绘制信息窗口的方法
	public void drawWindow(Canvas canvas, Point p) {
		int charSize = 13;// 字体宽度像素值
		int textSize = 15;// Android 字体大小
		int maxsize = 0;
		String[] messages = title.split("\n");
		int length = messages.length;
		for (int i = 0; i < length; i++) {
			int size = messages[i].length();
			if (maxsize < size)
				maxsize = size;
		}
		int winWidth = maxsize * charSize;
		int winHeight = length * (charSize) + 2 * arcR + padding * (length - 1);// 自动计算信息窗体高度
		Paint paint = new Paint();// 创建paint对象
		paint.setAntiAlias(true);// 打开抗锯齿
		paint.setTextSize(textSize);// 设置文字大小
		// 绘制信息窗体圆角矩形
		paint.setARGB(255, 18, 18, 18);// 设置画笔颜色
		int x1 = p.x - winWidth / 2;// 计算圆角矩形外接矩形左上侧点xy的坐标
		int y1 = p.y - picHeight - winHeight - 1;
		int x2 = x1 + winWidth;// 计算圆角矩形外接矩形右下侧点xy的坐标
		int y2 = y1 + winHeight;		
		RectF r = new RectF(x1, y1, x2, y2);// 创建圆角矩形对象
		canvas.drawRoundRect(r, arcR, arcR, paint);
		//绘制箭头形状
		canvas.drawLine(startx+radius, starty + 2, startx + radius*2, y2, paint);
		canvas.drawLine(startx+radius, starty + 2, startx, y2, paint);
		canvas.drawLine(startx + radius, y2, startx - radius, y2, paint);
		paint.setARGB(255, 198, 195, 198);// 设置画笔颜色
		paint.setStyle(Paint.Style.STROKE);// 设置绘制线性
		paint.setStrokeWidth(2);// 设置线的宽度
		canvas.drawRoundRect(r, arcR, arcR, paint);// 绘制圆角矩形框
		
		// 循环绘制每行文字
		paint.setStrokeWidth(0);
		paint.setTextSize(textSize);
		paint.setColor(Color.WHITE);// 设置画笔颜色
		int lineY = y1 + arcR;// 计算第一行的Y坐标
		for (int i = 0; i < messages.length; i++) {
			int y = charSize * (i + 1) + padding * i ; 
			StringBuffer buffer = new StringBuffer();
			for (int j = 0; j < suffix; j++) {
				buffer.append(" ");
			}
			buffer.append(messages[i]);
			canvas.drawText(buffer.toString(), x1, lineY + y, paint);
		}
	}
}
